package com.example.tpl.system.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.tpl.system.dao.NoticeDao;
import com.example.tpl.system.entity.NoticeBean;
import com.example.tpl.system.service.NoticeService;
import com.example.tpl.system.util.Result;
import com.example.tpl.system.util.ResultPage;
import com.example.tpl.system.vo.common.DeleteBatchReqVo;
import com.example.tpl.system.vo.common.QueryDetailReqVo;
import com.example.tpl.system.vo.common.UpdateStatusReq;
import com.example.tpl.system.vo.req.NoticeReqVo;
import com.example.tpl.system.vo.req.QueryNoticeReqVo;
import com.example.tpl.system.vo.resp.NoticeRespVo;

/**
 * 描述：通知公告
 * 作者：刘飞华
 * 日期：2025/01/10 15:34:35
 */
@Service
public class NoticeServiceImpl implements NoticeService {

    @Autowired
    private NoticeDao noticeDao;

    /**
     * 添加通知公告
     *
     * @param notice 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025/01/10 15:34:35
     */
    @Override
    public Result<Integer> addNotice(NoticeReqVo notice) {

        LambdaQueryWrapper<NoticeBean> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(NoticeBean::getNoticeTitle, notice.getNoticeTitle());

        NoticeBean noticeBean = noticeDao.selectOne(wrapper);
        if (noticeBean != null) {
            return Result.error("标题已存在");
        }

        NoticeBean bean = new NoticeBean();
        bean.setNoticeTitle(notice.getNoticeTitle()); //公告标题
        bean.setNoticeType(notice.getNoticeType()); //公告类型（1:通知,2:公告）
        bean.setNoticeContent(notice.getNoticeContent()); //公告内容
        bean.setStatus(notice.getStatus()); //公告状态（0:关闭,1:正常 ）
        bean.setRemark(notice.getRemark()); //备注

        int i = noticeDao.insert(bean);

        return Result.success(i);
    }

    /**
     * 删除通知公告
     *
     * @param notice 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025/01/10 15:34:35
     */
    @Override
    public Result<Integer> deleteNotice(DeleteBatchReqVo notice) {
        int i = noticeDao.deleteByIds(notice.getIds());
        return Result.success(i);
    }

    /**
     * 更新通知公告
     *
     * @param notice 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025/01/10 15:34:35
     */
    @Override
    public Result<Integer> updateNotice(NoticeReqVo notice) {

        NoticeBean noticeBean = noticeDao.selectById(notice.getId());
        if (noticeBean == null) {
            return Result.error("通知公告不存在");
        }

        LambdaQueryWrapper<NoticeBean> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(NoticeBean::getNoticeTitle, notice.getNoticeTitle());
        wrapper.ne(NoticeBean::getId, notice.getId());

        NoticeBean res = noticeDao.selectOne(wrapper);
        if (res != null) {
            return Result.error("标题已存在");
        }

        NoticeBean bean = new NoticeBean();
        bean.setId(notice.getId());//公告ID
        bean.setNoticeTitle(notice.getNoticeTitle());//公告标题
        bean.setNoticeType(notice.getNoticeType());//公告类型（1:通知,2:公告）
        bean.setNoticeContent(notice.getNoticeContent());//公告内容
        bean.setStatus(notice.getStatus());//公告状态（0:关闭,1:正常 ）
        bean.setRemark(notice.getRemark());//备注

        int i = noticeDao.updateById(bean);

        return Result.success(i);
    }

    /**
     * 更新通知公告状态
     *
     * @param notice 请求参数
     * @return int
     * @author 刘飞华
     * @date: 2025/01/10 15:34:35
     */
    @Override
    public Result<Integer> updateNoticeStatus(UpdateStatusReq notice) {

        LambdaUpdateWrapper<NoticeBean> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.in(NoticeBean::getId, notice.getIds()).set(NoticeBean::getStatus, notice.getStatus());
        int i = noticeDao.update(updateWrapper);

        return Result.success(i);
    }

    /**
     * 查询通知公告详情
     *
     * @param notice 请求参数
     * @return NoticeResp
     * @author 刘飞华
     * @date: 2025/01/10 15:34:35
     */
    @Override
    public Result<NoticeRespVo> queryNoticeDetail(QueryDetailReqVo notice) {

        NoticeBean item = noticeDao.selectById(notice.getId());

        if (item == null) {
            return Result.error("通知公告不存在");
        }

        NoticeRespVo resp = new NoticeRespVo();
        resp.setId(item.getId());//公告ID
        resp.setNoticeTitle(item.getNoticeTitle());//公告标题
        resp.setNoticeType(item.getNoticeType());//公告类型（1:通知,2:公告）
        resp.setNoticeContent(item.getNoticeContent());//公告内容
        resp.setStatus(item.getStatus());//公告状态（0:关闭,1:正常 ）
        resp.setRemark(item.getRemark());//备注
        resp.setCreateTime(item.getCreateTime());//创建时间
        resp.setUpdateTime(item.getUpdateTime());//修改时间

        return Result.success(resp);
    }

    /**
     * 查询通知公告列表
     *
     * @param notice 请求参数
     * @return NoticeResp
     * @author 刘飞华
     * @date: 2025/01/10 15:34:35
     */
    @Override
    public Result<ResultPage<NoticeRespVo>> queryNoticeList(QueryNoticeReqVo notice) {
        LambdaQueryWrapper<NoticeBean> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.like(notice.getNoticeTitle() != null, NoticeBean::getNoticeTitle, notice.getNoticeTitle());
        queryWrapper.like(notice.getNoticeType() != null, NoticeBean::getNoticeType, notice.getNoticeType());
        queryWrapper.eq(notice.getStatus() != null, NoticeBean::getStatus, notice.getStatus());

        Page<NoticeBean> page = noticeDao.selectPage(new Page<>(notice.getPageNo(), notice.getPageSize()), queryWrapper);


        List<NoticeRespVo> list = new ArrayList<>();
        for (NoticeBean x : page.getRecords()) {
            NoticeRespVo resp = new NoticeRespVo();
            resp.setId(x.getId());//公告ID
            resp.setNoticeTitle(x.getNoticeTitle());//公告标题
            resp.setNoticeType(x.getNoticeType());//公告类型（1:通知,2:公告）
            resp.setNoticeContent(x.getNoticeContent());//公告内容
            resp.setStatus(x.getStatus());//公告状态（0:关闭,1:正常 ）
            resp.setRemark(x.getRemark());//备注
            resp.setCreateTime(x.getCreateTime());//创建时间
            resp.setUpdateTime(x.getUpdateTime());//修改时间

            list.add(resp);
        }

        return Result.success(new ResultPage<>(list, page.getCurrent(), page.getSize(), page.getTotal()));

    }
}